package com.tim.test.number;

import org.junit.Test;

/**
 * 位运算
 *   左移：<<符号位变化
 *   右移：>>>符号位补0、>>符号位值不变；符号位移动
 *   运算：&、|、~、^
 *   进制：0b，0，0x
 *   零值：0x00000000正零，0x80000000负最大值
 * @author Adminis
 *
 */
public class BitManipulation {
	int a=0b1100, b=07760, c=0xff;
	
	// 获取指定位
	@Test
	public void getbit() {
//		int bitLoc = 2;
		int num = 0;
		for(int i=31; i>-1; i--) {
			System.out.print(num>>i & 1);
		}
		System.out.println(0x80000000);
	}

	// 设置指定位，-1全1，-2末位为0
	@Test
	public void setbit() {
		byte val = 3;
		int bitLoc = 0;
		int num = 12345;
		System.out.println((val&1)==1 ? num|(1L<<bitLoc) 
				: num&(-2L<<bitLoc));
//		System.out.println(num&(~1L<<bitLoc));
	}
	
	// 奇偶，正负
	@Test
	public void oddAndPositive() {
		int num = -3;
		System.out.println(num&1);// 奇偶
		System.out.println(num!=0 && (num>>1 ^ num>>>1)==0);// 正负
		System.out.println(num>>1 ^ num>>>1);// 
		System.out.println(Integer.MAX_VALUE<<1);// -2
		System.out.println(Integer.MIN_VALUE<<1);// 0
		System.out.println(-1>>3);
		System.out.println(-1>>>1);
		System.out.println(Integer.MAX_VALUE);
	}
	
	@Test
	public void switchSign() {
		int num = 257;
		System.out.println(~num+1);
	}
}
